package com.zhiche.lisa.bms.service.fee;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.google.common.collect.Multimap;
import com.zhiche.lisa.bms.dao.model.bill.Bill;
import com.zhiche.lisa.bms.dao.model.contract.Contract;
import com.zhiche.lisa.bms.dao.model.contract.ContractFinalpay;
import com.zhiche.lisa.bms.dao.model.contract.ContractFleetDtl;
import com.zhiche.lisa.bms.dao.model.fee.FeePayable;
import com.zhiche.lisa.bms.dao.model.price.PricePurchase;
import com.zhiche.lisa.bms.pojo.dto.fee.ShipParamDTO;
import com.zhiche.lisa.bms.pojo.dto.fee.TmsReleaseDto;
import com.zhiche.lisa.bms.pojo.vo.common.CommonVO;
import com.zhiche.lisa.bms.pojo.vo.common.FeePermissCommonVO;
import com.zhiche.lisa.bms.pojo.vo.fee.FeePayableHeaderVO;
import com.zhiche.lisa.bms.pojo.vo.fee.FeePayableVO;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 应付账款 服务类
 * </p>
 *
 * @author zhangkun
 * @since 2018-09-03
 */
public interface FeePayableService extends IService<FeePayable> {
    /**
     * 无户信息查询
     *
     * @param ew
     * @return
     */
    List<FeePayable> selectListNoTenant(Wrapper<FeePayable> ew);

    /**
     * 无户信息查询
     *
     * @param ew
     * @return
     */
    List<FeePayableVO> selectPayableAndPriceDtlListNoTenant(Wrapper<FeePayable> ew);

    /**
     * 查询账款列表
     *
     * @param condition
     * @return
     */
    List<FeePayable> selectFeePayableList(Map<String, Object> condition);

    /**
     * 分页查询应付账款
     */
    Page<FeePayable> queryFeePayablePage(Page<FeePayable> page);

    /**
     * 根据多个id查询应付账款
     *
     * @param ids
     * @return
     */
    List<FeePayable> queryFeePayableByIds(List<Long> ids);

    /**
     * 根据id查询应付账款
     *
     * @param id
     * @return
     */
    FeePayable queryFeePayableById(Long id);

    /**
     * 根据id查询应付账款总和信息
     *
     * @param ids
     * @return
     */
    FeePayableHeaderVO queryFeePayableSumHeader(List<Long> ids);

    /**
     * 同步生成应付账款
     *
     * @param shipParamDTO
     * @return
     */
    String synchroCreateFeePayable(ShipParamDTO shipParamDTO);

    /**
     * otm同步价格
     *
     * @param feePayable
     */
    void updateExtPurchasePriceByItemUidNoTenant(FeePayable feePayable);

    /**
     * 自动更新应付账单
     *
     * @param id
     */
    void updateFeePayablePrice(Long id);

    /**
     * 定时更新应付账款
     */
    void scheduledUpdateFeePayablePrice();

    /**
     * 新增应付账单
     *
     * @param feePayable
     * @return
     */
    FeePayable insertOneFeePayable(FeePayable feePayable);

    List<FeePayable> insertBatchFeePayable(List<FeePayable> feePayables);

    /**
     * 生成应付账款表
     *
     * @param pricePurchase
     * @param token
     */
    void insertFeePayable(PricePurchase pricePurchase, String token);

    /**
     * 获取应付账款的结算总金额
     *
     * @param pricePurchase
     * @return
     */
    BigDecimal getActualAmt(PricePurchase pricePurchase);

    /**
     * 根据OTM运单号明细id和主表ID,查询应付账款
     *
     * @param waybillDtlId
     * @param ids
     * @return
     */
    List<FeePayable> getFeePayableByWaybillDtlId(String waybillDtlId, List<Long> ids);

    /**
     * 根据应付账款ID得到账单
     *
     * @param ids
     * @return
     */
    List<Bill> getBillByFeePayableID(List<Long> ids);

    /**
     * 根据主键，修改应付账款
     *
     * @param feePayable
     */
    void updateFeePayable(FeePayable feePayable);

    /**
     * 根据账单ID，得到多个应付账款聚合金额
     *
     * @param billId
     * @return
     */
    BigDecimal getFeePayableDeductTotalByBillid(Long billId);

    /**
     * 根据车队id获取对应合同车队明细
     *
     * @param feePayableId
     * @return
     */
    List<ContractFinalpay> getContractFinalpayList(Long feePayableId);

    /**
     * 根据条件获取指定列的总和
     *
     * @param columnType
     * @param condition
     * @return
     */
    Object getColumnSum(String columnType, Map<String, Object> condition);

    /**
     * 根据指令号获取对应的数量
     *
     * @param orderCode
     * @return
     */
    Integer getCountByOrderCode(String orderCode);

    /**
     * 根据路由模式更新应付账单发运状态
     */
    void updateFeePayableByRouteMode(List<FeePayable> feePayables);

    List<FeePayable> updateAppointFeePayableByRouteMode(List<Long> ids);

    /**
     * 获取对应 id集合
     *
     * @param page
     * @return
     */
    List<Object> queryFeePayableIdList(Page<FeePayable> page);

    /**
     * 根据id集合
     *
     * @param page
     * @return
     */
    Page<FeePayable> queryFeePayablePageByIds(Page<CommonVO> page);

    /**
     * 计算油卡和现金比例
     *
     * @param contractFleetDtls
     * @param feePayable
     * @param contract
     */
    Multimap<String, BigDecimal> computeOilRate(List<ContractFleetDtl> contractFleetDtls, FeePayable feePayable, Contract contract);

    /**
     * 更新客户
     *
     * @param condition
     */
    void updateCiamsId(Map<String, Object> condition);

    /**
     * 判断是否可以出账
     *
     * @param idList
     */
    FeePermissCommonVO queryPermissOrderCode(Long[] idList);

    /**
     * 获取人送的订单 - 没有OR号的
     *
     * @return
     */
    List<FeePayable> updateSendDriverFeePayable();

    /**
     * 根据指令号获取对应的账款总油费和现金费用
     *
     * @return
     */
    FeePayable selectCashAndOilSumNoTenant(String orderCode);

    /**
     * 如果正常发运, 更新慧运车未发运的数据
     *
     * @param orderCode
     */
    void updateHuiyuncheLoadStatusByOrderCode(String orderCode);

    /**
     * 根据支付申请id集合获取对应下的应付账款
     *
     * @param payApplyIds
     * @return
     */
    List<FeePayable> queryFeePayableListByPayApplyIdList(Collection<Long> payApplyIds);

    /**
     * 修改数据
     *
     * @param tmsReleaseDto
     */
    void updateFeePayableForTms(TmsReleaseDto tmsReleaseDto);

    /**
     * 获取慧运车价格数据
     *
     * @param sysWaybillIdList
     */
    List<JSONObject> getHuiyunchePrice(List<String> sysWaybillIdList);

    /**
     * 更新慧运车信息
     *
     * @param feeIdList
     */
    void updateHycData(List<Long> feeIdList);
}
